Santiago R. , Birge Súkrú "Ken"
import numpy as np
import matplotlib.pyplot as plt
import scipy.constants as cs
import pandas as pd
Data_Path = "Data/"
100*1e3/(2*1e-6)/cs.c
v = cs.c/10
v*2*1e-6
Beta = 0.997
Gamma = 1/np.sqrt(1-Beta**2)
z = 1 #muon charge
K = -4*np.pi/(cs.m_e*cs.c**2)
K_2 = (cs.e**2/(4*np.pi*cs.epsilon_0))**2
n_al = cs.N_A*13*2.7*1e6/(26.981539)
n_lead = cs.N_A*82*11.34*1e6/(207.2)
I_Al = 10*cs.e*13
I_Lead = 10*cs.e*82
ln_Al = 2*cs.m_e*cs.c**2*Beta**2/(I_Al*(1-Beta**2))
ln_Lead = 2*cs.m_e*cs.c**2*Beta**2/(I_Lead*(1-Beta**2))
dEdx_Al = K*n_al*z**2/Beta**2*K_2*(np.log(ln_Al)-Beta**2) *1e-6*1e-2/cs.e
dEdx_Lead = K*n_lead*z**2/Beta**2*K_2*(np.log(ln_Lead)-Beta**2) *1e-6*1e-2/cs.e
print(dEdx_Al, "MeV/cm")
print(dEdx_Lead, "MeV/cm")
dEdx_Al*6
dEdx_Lead*10
1.6726219*1e-27*cs.c*5/cs.e
#PMT1
dNdt = np.array([713,673,670,673,667,670,681,742,639,651])
dt = 1 #second
Impedanz = 50 #ohm, Quad Scaler
#PMT2
dNdt = np.array([1390,1282,1470,1370,1301,1250,1201,1238,1244,1547])
dt = 1 #second
#PMT3
dNdt = np.array([44712,42164,39170,37567,39240,38539,36668,36473,39693,36576])
dt = 1 #second
#PMT4
dNdt = np.array([829,885,838,879,836,812,894,836,899,865])
dt = 1 #second
#PMT5
dNdt = np.array([23246,22930,23513,19091,19692,20946,20712,22777,20511,20160])
dt = 1 #second
Event Rates - Photomultipliers, Dark Room
#PMT1
dNdt = np.array([508,456,422,488,507,481,532,534,580,492])
dt = 1 #second
Impedanz = 50 #ohm, Quad Scaler
#PMT2
dNdt = np.array([1335,1360,1202,1278,1332,1163,1271,1338,1308,1317])
dt = 1 #second
#PMT3
dNdt = np.array([9502,9084,8716,9737,6833,6973,6758,6815,6656,6544,5417,9794])
dt = 1 #second
#PMT4
dNdt = np.array([726,901,834,924,982,951,858,854,851,945,767,800])
dt = 1 #second
#PMT5
dNdt = np.array([5414,6171,5245,7166,5224,5454,7847,7833,8470,9521,6790,6401])
dt = 1 #second
Event Rates - Scintillators
#SC1 - same as PMT 1
dNdt = np.array([508,456,422,488,507,481,532,534,580,492])
dt = 1 #second
Impedanz = 50 #ohm, Quad Scaler
#SC2 - PMT 2 and 4
dNdt = np.array([153,147,144,144,135,119,165,165,130,163])
dt = 1 #second
#SC3 - PMT 3 and 5
dNdt = np.array([156,170,171,157,149,162,129,172,161,173,164,154])
dt = 1 #second
#SC1 and SC2
dNdt = np.array([19,14,14,11,19,11,8,11,11,16,12,27])
dt = 1 #second
#SC1, SC2 and SC3
dNdt = np.array([2,5,8,4,3,4,10,4,8,6,7,2])
dt = 1 #second
#SC1 and SC2 with SC3 Veto
dNdt = np.array([11,6,8,11,15,13,8,12,13,13])
dt = 1 #second
#SC2 and SC3
dNdt = np.array([16,20,15,20,22,17,14,14,12,25])
dt = 1 #second
#SC2 or SC3
dNdt = np.array([348,302,304,261,306,288,301,287,291,269])
dt = 1 #second
Data = pd.read_csv(Data_Path+"MainRun1.Spe")
Data
x = int(len(Data))-10
A = np.array(Data['$SPEC_ID:'][11:16000], dtype=int)
A
channels = np.arange(1,len(A)+1,1)
plt.plot(channels,A)
#Quad Coincidence Passthrough SC1 to Coincidence Unit Start Signal Logic
dt = 18 #ns
#Quad Coincidence SC2 or SC3 to Coincidence Unit Stop Signal Generator/Logic
dt = 15.6 #ns
%matplotlib inline
import importlib
if not importlib.util.find_spec('iminuit'):
!conda install -c conda-forge iminuit
import iminuit
%load_ext autoreload
%autoreload 1
%run muonutils
import numpy as np
import matplotlib.pyplot as plt
with open("Data/Calibration/2mys.Spe") as fp:
Lines = fp.readlines()
print(len(Lines))
count = 0
for line in Lines:
count += 1
if "0 16383" in line:
start = count
break
print("done")
print(start)
end = start+16383
print(end)
x = np.arange(0,16383)
with open("Data/Calibration/80ns.Spe") as fp:
Lines = fp.readlines()
data = [int(i) for i in Lines[start:end]]
dta = np.array(data)
for i,val in enumerate(data):
if val != 0:
print(i+1)
break
plt.plot(x,data,)
with open("Data/Calibration/2mys.Spe") as fp:
Lines = fp.readlines()
data = [int(i) for i in Lines[start:end]]
dta = dta + np.array(data)
for i,val in enumerate(data):
if val != 0:
print(i+1)
break
plt.plot(x,data,)
with open("Data/Calibration/4_04.Spe") as fp:
Lines = fp.readlines()
data = [int(i) for i in Lines[start:end]]
dta = dta + np.array(data)
for i,val in enumerate(data):
if val != 0:
print(i+1)
break
plt.plot(x,data,)
with open("Data/Calibration/6_02mys.Spe") as fp:
Lines = fp.readlines()
data = [int(i) for i in Lines[start:end]]
dta = dta + np.array(data)
for i,val in enumerate(data):
if val != 0:
print(i+1)
break
plt.plot(x,data,)
with open("Data/Calibration/8_04mys.Spe") as fp:
Lines = fp.readlines()
data = [int(i) for i in Lines[start:end]]
dta = dta + np.array(data)
for i,val in enumerate(data):
if val != 0:
print(i+1)
break
plt.plot(x,data,)
with open("Data/Calibration/10mys.Spe") as fp:
Lines = fp.readlines()
data = [int(i) for i in Lines[start:end]]
dta = dta + np.array(data)
for i,val in enumerate(data):
if val != 0:
print(i+1)
break
plt.plot(x,data,)
with open("Data/Calibration/12mys.Spe") as fp:
Lines = fp.readlines()
data = [int(i) for i in Lines[start:end]]
dta = dta + np.array(data)
for i,val in enumerate(data):
if val != 0:
print(i+1)
break
plt.plot(x,data,)
with open("Data/Calibration/12_5mys.Spe") as fp:
Lines = fp.readlines()
data = [int(i) for i in Lines[start:end]]
dta = dta + np.array(data)
for i,val in enumerate(data):
if val != 0:
print(i+1)
break
plt.plot(x,data,)
lines = [' ' + str(i) + '\n' for i in dta]
with open("Data/Calibration/Calibration Parsed.Spe", "w") as fp:
Lines[start:end] = lines
fp.writelines(Lines)
plt.plot(x,dta)
del dta
def draw_lifetime_spectrum(spectrum, fitresult=None):
fig, ax = plt.subplots(figsize=(7., 5.))
ax.set_ylabel('Entries')
if spectrum.axislabel is not None:
ax.set_xlabel(spectrum.axislabel)
ax.margins(x=0)
ax.hist(x=spectrum.centers, bins=spectrum.edges, weights=spectrum.values, histtype='step')
if fitresult is not None:
x = np.linspace(spectrum.edges[0], spectrum.edges[-1], 501)
ax.plot(x, fitresult.curve(*fitresult.values)(x), zorder=0)
draw_lifetime_spectrum(load_spectrum("Data/Background.Spe"))
plt.savefig('background_spectrum.pdf')
def draw_calibration_spectrum(spectrum, points):
fig, ax = plt.subplots(nrows=2, sharex=True, gridspec_kw=dict(hspace=0), figsize=(7., 7.))
ax[-1].set_xlabel('Channel number')
ax[0].set_ylabel('Entries')
ax[0].margins(x=0, y=0.25)
ax[0].hist(bins=spectrum.edges, x=spectrum.centers, weights=spectrum.values, histtype='step')
for i in range(len(points)):
chan_no = points.at[i,'chan']
text = '%.1f' % points.at[i,'time']
color = 'gray'
ax[0].annotate(text, xy=(chan_no, spectrum.values[chan_no]), xytext=(0., 15.), va='baseline', ha='center', fontsize='smaller', textcoords='offset points', color=color, arrowprops=dict(arrowstyle='->', shrinkA=0.1, facecolor=color, edgecolor=color))
ax[1].set_ylabel('Time [μs]')
ax[1].errorbar(points.chan, points.time, xerr=points.chan_err, yerr=points.time_err, fmt='none', edgecolor='k')
def draw_calibration_fit(points, fitresult):
fig, ax = plt.subplots(figsize=(5., 5.))
ax.set_xlabel('Channel number')
ax.set_ylabel('Time [μs]')
ax.errorbar(points.chan, points.time, xerr=points.chan_err, yerr=points.time_err, fmt='none', edgecolor='k', zorder=1)
if fitresult is not None:
x = np.linspace(0., 4296., 4296, False)
ax.plot(x, fitresult.curve(*fitresult.values)(x), zorder=0)
calibration_points = pd.DataFrame(columns=['chan', 'time', 'chan_err', 'time_err'], data=[
# Format:
# (Channel number, time, error of channel number, error of time)
# Beispiel:
(120, 0.08, 5, 0.02),
(682, 2., 5, 0.2),
(1367, 4.04, 5, 0.2),
(2031, 6.02, 5, 0.2),
(2716, 8.04, 5, 0.2),
(3387, 10., 5, 0.2),
(4112, 12., 5, 0.2),
(4242, 12.5, 5, 0.2),
])
draw_calibration_spectrum(load_spectrum('Data/Calibration/Calibration Parsed.Spe'), calibration_points)
plt.savefig('calibration_spectrum.pdf')
def fit_calibration(points):
def line(m, b):
'''Return a line with slope m and intercept b.'''
return lambda x: m * x + b
return fit(method=weighted_least_squares,
curve=line,
data=dict(
x=points.chan.values,
y=points.time.values,
ey=points.time_err.values
),
params=dict(
m=0.01, error_m=0.01,
b=0., error_b=0.01
))
calibration = fit_calibration(calibration_points)
calibration
draw_calibration_fit(calibration_points, calibration)
plt.savefig('calibration_fit.pdf')
calibration.values
calibration.fval
calibration.curve(*calibration.values)(np.array([500, 1000, 1500]))
3.643/5
raw_spectrum = load_spectrum('Data/MainRunFinal.Spe')
draw_lifetime_spectrum(raw_spectrum)
plt.savefig('raw_spectrum.pdf')
spectrum = raw_spectrum
spectrum = spectrum.rebin(start=1400, stop=3500, ngroup=10)
spectrum = spectrum.replace_axis(calibration.curve(*calibration.values)(spectrum.edges), 'Time [μs]')
draw_lifetime_spectrum(spectrum)
plt.savefig('rebinned_spectrum.pdf')
def fit_spectrum(spectrum, **params):
# Define curve to be fitted:
from numpy import exp
def curve(tau_mu, n, c):
f = 1.27
Q = 0.993
A = 0.7054
tau_eff = 1/(Q/tau_mu+A)
return lambda t: n / tau_mu * exp(-t/tau_mu) + n / (f*tau_eff) * exp(-t/tau_eff) + c
# Default parameter configuration:
params.setdefault('tau_mu', 1.)
params.setdefault('error_tau_mu', params['tau_mu'])
params.setdefault('n', 1000.)
params.setdefault('error_n', params['n'])
params.setdefault('c', spectrum.values[-4:].mean())
params.setdefault('error_c', params['c'])
# Run fit at the bin centers:
return fit(method=chi_squared,
curve=curve,
data=spectrum,
params=params)
fitresult = fit_spectrum(spectrum)
display(fitresult)
draw_lifetime_spectrum(spectrum, fitresult)
plt.savefig('fit_spectrum.pdf')
spectrum = raw_spectrum
spectrum = spectrum.rebin(start=1500, stop=3500, ngroup=10)
modified_calibration = calibration.values- calibration.values*(0.013/0.3)
spectrum = spectrum.replace_axis(calibration.curve(*modified_calibration)(spectrum.edges), 'Time [μs]')
draw_lifetime_spectrum(spectrum)
print(modified_calibration)
fitresult = fit_spectrum(spectrum)
display(fitresult)
draw_lifetime_spectrum(spectrum, fitresult)
spectrum = raw_spectrum
spectrum = spectrum.rebin(start=1500, stop=3500, ngroup=10)
modified_calibration = calibration.values+ calibration.values*(0.013/0.3)
spectrum = spectrum.replace_axis(calibration.curve(*modified_calibration)(spectrum.edges), 'Time [μs]')
draw_lifetime_spectrum(spectrum)
print(modified_calibration)
fitresult = fit_spectrum(spectrum)
display(fitresult)
draw_lifetime_spectrum(spectrum, fitresult)
#Different Binning
spectrum = raw_spectrum
spectrum = spectrum.rebin(start=1500, stop=8000, ngroup=20)
modified_calibration = calibration.values
spectrum = spectrum.replace_axis(calibration.curve(*modified_calibration)(spectrum.edges), 'Time [μs]')
draw_lifetime_spectrum(spectrum)
print(modified_calibration)
fitresult = fit_spectrum(spectrum)
display(fitresult)
draw_lifetime_spectrum(spectrum, fitresult)
#Different Binning
spectrum = raw_spectrum
spectrum = spectrum.rebin(start=1500, stop=16000, ngroup=29)
modified_calibration = calibration.values
spectrum = spectrum.replace_axis(calibration.curve(*modified_calibration)(spectrum.edges), 'Time [μs]')
draw_lifetime_spectrum(spectrum)
print(modified_calibration)
fitresult = fit_spectrum(spectrum)
display(fitresult)
draw_lifetime_spectrum(spectrum, fitresult)